package br.com.tcc.validators;

import java.io.IOException;
import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import br.com.tcc.model.Anunciante;
import br.com.tcc.model.Usuario;
import br.com.tcc.util.Utils;

@ManagedBean(name="authorizationListener")
@RequestScoped
public class AuthorizationListener implements Serializable{
	
	Logger logger = Logger.getLogger(AuthorizationListener.class);
	/**
	 * 
	 */
	private static final long serialVersionUID = -5541062561053595509L;
	
	/**
	 * Realizar o tratamento para acesso as paginas do sistema
	 * Valida para que somente  ADMIN acesse a pagina requisitada
	 * @param event
	 */
	public void adminPhase(PhaseEvent event) {
		FacesContext facesContext = event.getFacesContext();
		String currentPage = facesContext.getViewRoot().getViewId();
		boolean erro = false;
		Usuario currentUser = (Usuario) Utils.recuperaUsuarioSessao();

		if (currentUser == null ) {
			erro = true;
		}else {
			if (!currentUser.getTipoUsuario().trim().equals("A")) {
				erro = true;
			}
		}
		if (erro) {
			logger.info("negado: " + currentPage);
			FacesContext context = FacesContext.getCurrentInstance();
			HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
					
			try {
				response.sendRedirect("inicio.jsf");
			} catch (IOException e) {
				logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}	
			
		}
	}
	
	/**
	 * Realizar o tratamento para acesso as paginas do sistema
	 * Valida para que somente  Usuario acesse a pagina requisitada
	 * @param event
	 */
	public void userPhase(PhaseEvent event) {
		FacesContext facesContext = event.getFacesContext();
		String currentPage = facesContext.getViewRoot().getViewId();

		Usuario currentUser = (Usuario) Utils.recuperaUsuarioSessao();

		if (currentUser == null) {
			logger.info("negado: " + currentPage);
			FacesContext context = FacesContext.getCurrentInstance();
			HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
					
			try {
				response.sendRedirect("inicio.jsf");
			} catch (IOException e) {
				logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
			}
		}
	}
	/**
	 * Realizar o tratamento para acesso as paginas do sistema
	 * Valida para que somente  Anunciante acesse a pagina requisitada
	 * @param event
	 */
	public void anunciantePhase(PhaseEvent event) {
		FacesContext facesContext = event.getFacesContext();
		String currentPage = facesContext.getViewRoot().getViewId();

		HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
		Anunciante currentUser = (Anunciante) session.getAttribute("anuncianteSession");

		if (currentUser == null) {
			logger.info("negado: " + currentPage);
			FacesContext context = FacesContext.getCurrentInstance();
			HttpServletResponse response = (HttpServletResponse) context
					.getExternalContext().getResponse();
			try {
				response.sendRedirect("inicio.jsf");
			} catch (IOException e) {
				logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
			}
		}
	}
	
	/**
	 * Realizar o tratamento para acesso as paginas do sistema
	 * Valida para que somente admin ou Anunciante acesse a pagina requisitada
	 * @param event
	 */
	public void anuncianteAndAdminPhase(PhaseEvent event) {
		FacesContext facesContext = event.getFacesContext();
		String currentPage = facesContext.getViewRoot().getViewId();

		HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
		Usuario admin = Utils.recuperaUsuarioSessao();
		Anunciante anunciante = (Anunciante) session.getAttribute("anuncianteSession");

		//Tem que ser um anunciante ou o administrador logado no sistema
		if ( anunciante == null && ( admin == null  || !admin.getTipoUsuario().equals("A") )) {
			logger.info("negado: " + currentPage);
			FacesContext context = FacesContext.getCurrentInstance();
			HttpServletResponse response = (HttpServletResponse) context
					.getExternalContext().getResponse();
			try {
				response.sendRedirect("inicio.jsf");
			} catch (IOException e) {
				logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
			}
		}
	}
	
}